package controllers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import models.Constantes;
import views.EntrarGUI;

public class EntrarController{

	@SuppressWarnings("unused")
	private int dimensaoJogo;
	private EntrarGUI entrarGUI;
	private JFrame jfAnterior;
	private UDPClientController servidoresDAO;
	private ManterListaAtualizada threadManterListaAtualizada;
	private TCPClienteController socketCliente;

	public EntrarController(JFrame jFrame) {
		super();
		dimensaoJogo = 6;
		jfAnterior = jFrame;
		entrarGUI = new EntrarGUI();
		entrarGUI.setListener(new EntrarListener());
		entrarGUI.setVisible(true);
		entrarGUI.tfNomeJogador.grabFocus();
	}
	
	private void buscarServidores() {
		if(servidoresDAO == null){
			servidoresDAO = new UDPClientController(entrarGUI.tfIPDest.getText());
			servidoresDAO.setAtivo(true);
			setManterListaAtualizada(true);
			entrarGUI.btBuscar.setText("Parar");
		}else{
			setManterListaAtualizada(false);
			servidoresDAO.stop();
			servidoresDAO = null;
			entrarGUI.btBuscar.setText("Buscar");
		}
	}

	@SuppressWarnings("deprecation")
	public void setManterListaAtualizada(boolean ativa) {
		if((ativa)&&(threadManterListaAtualizada == null)){
			threadManterListaAtualizada = new ManterListaAtualizada();
			synchronized (threadManterListaAtualizada) {
				threadManterListaAtualizada.start();
			}
		}else{
			if(threadManterListaAtualizada != null)
				synchronized (threadManterListaAtualizada) {
					threadManterListaAtualizada.suspend();
					threadManterListaAtualizada = null;				
				}
		}
	}

	private void fechar(){
		try {
			setManterListaAtualizada(false);
			if(servidoresDAO != null){
				servidoresDAO.stop();
				servidoresDAO = null;		
			}
			entrarGUI.dispose();
			jfAnterior.setVisible(true);
			finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	private void setComponentesAtivos(boolean ativo) {
		entrarGUI.lsServidores.setFocusable(ativo);
		entrarGUI.tfIPDest.setEnabled(ativo);
		entrarGUI.tfNomeJogador.setEnabled(ativo);
		entrarGUI.btBuscar.setEnabled(ativo);
		entrarGUI.btVoltar.setEnabled(ativo);
	}

	private void conectarAoServidor(InetAddress srvIP) {
		socketCliente = new TCPClienteController(Constantes.PORTA_TCP_SERVIDOR, srvIP, 
				entrarGUI.tfNomeJogador.getText());
		socketCliente.aguardarInicio(entrarGUI);
		entrarGUI.lbStatus.setText("Aguardando Servidor Iniciar o Jogo");
		entrarGUI.btEntrar.setText("Cancelar");
		setComponentesAtivos(false);
	}

	private void atualizarLista(ArrayList<String> servs) {
		if(entrarGUI.lsServidores != null)
			synchronized (entrarGUI) {
				for (String servidor : servs)
					if (!entrarGUI.lsServidores.contains(servidor))
						entrarGUI.lsServidores.addItem(servidor);
				for (int i = 0; i < entrarGUI.lsServidores.getTamanho(); i++)
					if (!servs.contains(entrarGUI.lsServidores.getItem(i)))
						entrarGUI.lsServidores.remover(i);
			}
	}

	class EntrarListener implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			Object btn = e.getSource();
			if(btn == entrarGUI.btEntrar){
				if(entrarGUI.btEntrar.getText().equals("Conectar")){
					if(entrarGUI.lsServidores.getSelectedIndex() > -1){
						String[] params = entrarGUI.lsServidores.getSelectedValue().split(" ");
						try {
							InetAddress srvIP = InetAddress.getByName(params[0]);	
							conectarAoServidor(srvIP);				
						} catch (Exception e1) {
							e1.printStackTrace();
						}
					}else{
						JOptionPane.showMessageDialog(null,"Escolha um servidor para se conectar!");
					}
				}else{
					entrarGUI.lbStatus.setText("Selecione um Servidor");
					entrarGUI.btEntrar.setText("Conectar");	
					setComponentesAtivos(true);	
					if (socketCliente != null){
						socketCliente.stop();
						socketCliente = null;
					}
				}
			}
			if(btn == entrarGUI.btVoltar){
				fechar();
			}
			if(btn == entrarGUI.btBuscar){
				buscarServidores();				
			}
		}

	}
	
	class ManterListaAtualizada extends Thread {

		public void run() {
			while(entrarGUI.isVisible()){
				ArrayList<String> servs = servidoresDAO.getServidores();
//System.out.println("atualizando" + servs.toString());
					if(servs.size() == 0)
						entrarGUI.lsServidores.clear();
					else
						atualizarLista(servs);	
				synchronized (this) {
					try {
						this.wait(Constantes.DELAY_NOVA_BUSCA);
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}	
				}
			}
		}

	}
	
}
